package middleware

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-redis/redis"
	"github.com/golang-jwt/jwt/v4"
	"partyus_app/global"
	"partyus_app/response"
	"partyus_app/utils"
)

// VerifyJWT 中间件用于验证 JWT 令牌
//func VerifyJWT() gin.HandlerFunc {
//	return func(c *gin.Context) {
//		tokenString := c.GetHeader("Authorization")
//
//		// 解析和验证令牌
//		token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
//			if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
//				return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
//			}
//			return []byte(utils.SecretKey), nil // 使用和生成 JWT 时相同的密钥
//		})
//
//		if err != nil || !token.Valid {
//			response.CommonResp(c, 1, "token不合法", nil)
//			c.Abort()
//			return
//		}
//		// 提取 Claims
//		if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
//			// 你可以在此处使用 claims 中的数据
//			userID, ok := claims["ID"].(float64)
//			if !ok {
//				response.CommonResp(c, 1, "token不合法", nil)
//				//c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims"})
//				c.Abort()
//				return
//			}
//			c.Set("userID", int(userID))
//		} else {
//			//c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims"})
//			response.CommonResp(c, 1, "token不合法", nil)
//			c.Abort()
//			return
//		}
//
//		c.Next()
//	}
//}

// VerifyJWT 中间件用于验证 JWT 令牌
func VerifyJWT() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenString := c.GetHeader("Authorization")
		if tokenString == "" {
			response.CommonResp(c, 1, "token未提供", nil)
			c.Abort()
			return
		}

		// 解析和验证令牌
		token, err := utils.ParseString2Token(tokenString)

		if err != nil || !token.Valid {
			response.CommonResp(c, 1, "token过期，请重新登录", nil)
			c.Abort()
			return
		}
		//检测过期token
		redisKey := fmt.Sprintf("user:token:%s", tokenString)
		_, isExist := global.RedisRead().Get(redisKey).Result()
		if isExist == redis.Nil {
			response.CommonResp(c, 1, "token 已失效或未登录", nil)
			c.Abort()
			return
		} else if isExist != nil {
			response.CommonResp(c, 1, "Redis 检查失败", nil)
			c.Abort()
			return
		}
		//log.Println("debug:token存在redis中,", tokenString)
		// 提取 Claims
		if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
			// 提取 userID 和 role
			userID, idOk := claims["ID"].(float64)
			role, roleOk := claims["role"].(float64)
			if !idOk || !roleOk {
				response.CommonResp(c, 1, "token缺少必要信息", nil)
				c.Abort()
				return
			}

			// 将提取到的信息存储到 Gin 上下文中
			c.Set("userID", int(userID))
			c.Set("role", int(role))
		} else {
			response.CommonResp(c, 1, "token无效或解析失败", nil)
			c.Abort()
			return
		}

		c.Next()
	}
}
